package com.itcam.cm.manager.controller;


import com.itcam.cm.manager.service.SysRoleService;
import com.itcam.cm.model.dto.system.SysRoleDto;
import com.itcam.cm.model.entity.system.SysRole;
import com.itcam.cm.model.vo.common.Result;
import com.github.pagehelper.PageInfo;
import com.itcam.cm.model.vo.common.ResultCodeEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.lang.annotation.Target;
import java.util.Map;

@RestController
@CrossOrigin(allowCredentials = "true", originPatterns = "*", allowedHeaders = "*")
@RequestMapping("/admin/system/sysRole")
@Tag(name = "角色管理接口")
public class SysRoleController {

    @Autowired
    private SysRoleService sysRoleService;

    /**
     * 分页查询角色列表
     * 该方法接收一个 SysRoleDto 对象用于条件查询，以及页码和每页数量作为分页参数
     * 调用 SysRoleService 的 findByPage 方法进行分页查询，并将结果封装在 Result 对象中返回
     *
     * @param sysRoleDto 包含角色查询条件的 DTO 对象
     * @param pageNum    当前页码，从请求路径的 {pageNum} 变量中获取
     * @param pageSize   每页显示的记录数量，从请求路径的 {pageSize} 变量中获取
     * @return 包含分页信息的 Result 对象，状态码为成功
     */
    @GetMapping("/findByPage/{pageNum}/{pageSize}")
    @Operation(summary = "分页查询角色列表")
    public Result<PageInfo<SysRole>> findByPage(SysRoleDto sysRoleDto,
                                                @PathVariable(value = "pageNum") Integer pageNum,
                                                @PathVariable(value = "pageSize") Integer pageSize) {
        // 调用 SysRoleService 的 findByPage 方法，传入查询条件和分页参数进行分页查询
        PageInfo<SysRole> pageInfo = sysRoleService.findByPage(sysRoleDto, pageNum, pageSize);
        // 使用 Result.build 方法将查询结果和成功状态码封装在 Result 对象中并返回
        return Result.build(pageInfo, ResultCodeEnum.SUCCESS);
    }

    /**
     * 更新系统角色信息
     * 该方法接收一个 SysRole 对象作为请求体，调用 SysRoleService 的 updateSysRole 方法来更新角色信息
     * 最后返回一个包含操作结果的 Result 对象，状态码为成功
     *
     * @param sysRole 包含要更新的角色信息的 SysRole 对象
     * @return 一个包含操作结果的 Result 对象，状态码为成功，数据部分为 null
     */
    @PostMapping(value = "/updateSysRole")
    @Operation(summary = "更新系统角色信息")
    public Result updateSysRole(@RequestBody SysRole sysRole) {
        // 调用 SysRoleService 的 updateSysRole 方法，传入要更新的角色信息
        sysRoleService.updateSysRole(sysRole);
        // 使用 Result.build 方法构建一个表示操作成功的结果对象，数据部分为 null
        return Result.build(null, ResultCodeEnum.SUCCESS);
    }


    @GetMapping("getSysRoleListByPage/{page}/{limit}")
    public Result<PageInfo<SysRole>> getSysRoleListByPage(@PathVariable Integer page, @PathVariable Integer limit, SysRoleDto sysRoleDto) {
        // 调用业务层传入参数查询分页
        PageInfo<SysRole> pageInfo = sysRoleService.getSysRoleListByPage(page, limit, sysRoleDto);
        return Result.ok(pageInfo);
    }

    /**
     * 保存系统角色信息
     * 该方法接收一个 SysRole 对象作为请求体，调用 SysRoleService 的 saveSysRole 方法将角色信息保存到数据库
     * 最后返回一个表示操作成功的 Result 对象
     *
     * @param sysRole 包含要保存的角色信息的 SysRole 对象
     * @return 一个操作结果为成功的 Result 对象，数据部分为 null
     */
    @PostMapping("/saveSysRole")
    public Result saveSysRole(@RequestBody SysRole sysRole) {
        // 调用 SysRoleService 的 saveSysRole 方法，将传入的角色信息保存到数据库
        sysRoleService.saveSysRole(sysRole);
        // 返回操作结果为成功的 Result 对象，数据部分为 null
        return Result.ok(null);
    }

    /**
     * 根据角色 ID 删除角色信息
     * 该方法接收一个角色 ID 作为路径参数，调用 SysRoleService 的 deleteById 方法删除对应的角色信息
     * 最后返回一个包含操作结果的 Result 对象，状态码为成功
     *
     * @param roleId 要删除的角色的唯一标识
     * @return 一个包含操作结果的 Result 对象，状态码为成功，数据部分为 null
     */
    @DeleteMapping(value = "/deleteById/{roleId}")
    public Result deleteById(@PathVariable(value = "roleId") Long roleId) {
        // 调用 SysRoleService 的 deleteById 方法，传入要删除的角色 ID
        sysRoleService.deleteById(roleId);
        // 使用 Result.build 方法构建一个表示操作成功的结果对象，数据部分为 null
        return Result.build(null, ResultCodeEnum.SUCCESS);
    }


//    @PutMapping("updateSysRole")
//    public Result updateSysRole(@RequestBody SysRole sysRole) {
//        sysRoleService.updateSysRole(sysRole);
//        return Result.ok(null);
//    }

    @GetMapping(value = "/findAllRoles/{userId}")
    public Result<Map<String, Object>> findAllRoles(@PathVariable(value = "userId") Long userId) {
        Map<String, Object> resultMap = sysRoleService.findAllRoles(userId);
        return Result.ok(resultMap);
    }

}
